package com.tsf.hbase.util;

import java.util.ArrayList;
import java.util.List;

public final class BitUtil {

    private final static int BYTE_MASK = 0xFF;

    public static byte[] addBinary(byte[] augEnd, byte addend) {
        List<Byte> bytes = new ArrayList<>();
        byte[] result = null;
        for (int augEndEnd = augEnd.length - 1; augEndEnd >= 0; augEndEnd--) {
            if (result == null) {
                byte endByte = augEnd[augEndEnd];
                result = addByte(endByte, addend);
                bytes.add(result[1]);
            } else if (result[0] > 0x00) {
                byte endByte = augEnd[augEndEnd];
                result = addByte(endByte, result[0]);
                bytes.add(result[1]);
            } else {
                bytes.add(augEnd[augEndEnd]);
            }
        }
        if (result == null) {
            return new byte[]{};
        }
        if (result[0] > 0x00) {
            bytes.add(result[0]);
        }
        byte[] returnByte = new byte[bytes.size()];
        int returnByteLength = returnByte.length;
        for (byte singleByte : bytes) {
            returnByte[--returnByteLength] = singleByte;
        }
        return returnByte;
    }

    public static byte[] addByte(byte augEnd, byte addend) {
        byte[] result = new byte[2];
        int sum = (augEnd & BYTE_MASK) + (addend & BYTE_MASK);
        byte[] sumBytes = getBytes(sum, true);
        result[1] = (sumBytes[3]);
        if (sumBytes[2] > 0) {
            result[0] = sumBytes[2];
        }
        return result;
    }

    public static byte[] getBytes(int s, boolean asc) {
        byte[] buf = new byte[4];
        if (asc)
            for (int i = buf.length - 1; i >= 0; i--) {
                buf[i] = (byte) (s & 0x000000ff);
                s >>= 8;
            }
        else
            for (int i = 0; i < buf.length; i++) {
                buf[i] = (byte) (s & 0x000000ff);
                s >>= 8;
            }
        return buf;
    }
}